#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import flujo_entrada
from catlex import *
import string

class analizador_lexico:
    def __init__(self, entrada):
        self.entrada = entrada
        self.comp = None
        self.lexema = ""
        self.estado = 1
        self.avanza()
        
    def siguiente_componente(self):
        return self.comp
    
    def avanza(self):
        c = self.entrada.siguiente_caracter()
        self.estado = 1
        self.lexema = ""
        while 1:
            if self.estado == 1:
                if c in [" ", "\t", "\n"]:
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                    self.estado = 8
                elif c >= "a" and c <= "z":
                    self.lexema = self.lexema + c
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                    self.estado = 3
                elif c >= "0" and c <= "9":
                    self.lexema = self.lexema + c
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                    self.estado = 4
                elif c == ":":
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                    self.estado = 6
                elif c == "": # EOF
                    self.estado = 2
                else:
                    raise "ERROR" # -> sustituir por tratamiento
                
            elif self.estado == 2:
                self.comp = eof()
                break
            
            elif self.estado == 3:
                if (c >= "a" and c <= "z") or (c >= "0" and c <= "9"):
                    self.lexema = self.lexema + c
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                else:
                    lexema = self.lexema
                    self.lexema = ""
                    self.comp = identificador(lexema)
                    break
                
            elif self.estado == 4:
                if c >= "0" and c <= "9":
                    self.lexema = self.lexema + c
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                elif c == ".":
                    self.lexema = self.lexema + c
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                    self.estado = 5
                else:
                    self.comp = entero(string.atoi(self.lexema))
                    break
                
            elif self.estado == 5:
                if c >= "0" and c <= "9":
                    self.lexema = self.lexema + c
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                else:
                    self.comp = real(string.atof(self.lexema))
                    break
                
            elif self.estado == 6:
                if c == "=":
                    self.entrada.avanza()
                    c = self.entrada.siguiente_caracter()
                    self.estado = 7
                else:
                    raise "ERROR" # -> sustituir por tratamiento
                
            elif self.estado == 7:
                self.comp = asignacion()
                break
            
            elif self.estado == 8:
                if c not in [" ", "\t", "\n"]:
                    self.lexema = ""
                    self.estado = 1
                else:
                    self.avanza()
                    c = self.entrada.siguiente_caracter()
                    
if __name__ == "__main__":
    fe = flujo_entrada.cadena("ab := 4 abc10 2.100")
    a = analizador_lexico(fe)
    while a.siguiente_componente().cat != cat.eof:
        print a.siguiente_componente()
        a.avanza()
            